﻿using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Windows.Forms;
using GPSMap.Core.Misc.DAL;
using MapControl.Misc.DAL;
using MapControl.Misc.GPSPoint;
using MITI;

namespace MapControl.Misc
{
    public static class GeneralClass
    {
        public static int FULL_DATA_LEN = 49; //Tổng chiều dài của một gpsdata
        public static int DATA_LEN = 46; //Tổng leng các giá trị cộng với các dấu phẩy ',' phân cách
        public static int NAME_LEN = 4;
        public static int LAT_LEN = 8;
        public static int LON_LEN = 9;
        public static int ALT_LEN = 4;
        public static int SPEED_LEN = 3;
        public static int ANGLE_LEN = 3; //Hướng bay
        public static int TIME_LEN = 6; //Thời gian thiết bị gửi tọa độ gps
        public static int SATNUM_LEN = 2; //Số vệ tinh đang dùng

        public static string GPSData; //Dữ liệu gps gửi về

        public static ComPort objPort; //Cổng COM
        public static DataTable dbTestGPS; //Datatable lưu danh sách các tọa độ gps
        public static BaseGPSPoint currGPSData; //Tọa độ GPS mới nhất (chỉ còn dùng cho Test)
        public static Dictionary<string, GPSCurrentPoint> currGPSDataArr = new Dictionary<string, GPSCurrentPoint>(); //Danh sách tọa độ GPS hiện hành của các đường bay 
        public static Airport objCurrAirport; //Sân bay đang chọn
        public static bool IsViewAirport = false; //Cho biết hiện/ẩn sân bay

        public static Dictionary<string, string> planeDict;
        public static Plane objCurrPlane; //Máy bay đang chọn
        public static int min, max; //Giá trị lọc số lượng record gpsdata
        //Tên file CSDL đang kết nối
        public static string gpsDBFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\gpsdata.sdf";
        //Tên file CSDL đang xem lại
        public static string reviewGpsDBFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\gpsdata.sdf";
        //Tên file CSDL chứa thông tin sân bay
        public static string appDBFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\appdata.sdf"; 

        /// <summary>
        /// Cho biết trạng thái chạy replay:
        /// 0: Đang dừng
        /// 1: Đang chạy
        /// 2: Tạm dừng
        /// </summary>
        public static int IsReplay = 0;

        public static bool IsViewLatestGPSPoint = false;

        /// <summary>
        /// Kết nối CSDL theo CSDL hiện tại
        /// Kiểm tra CSDL ngày hôm nay đã tạo chưa
        /// Nếu chưa thì backup CSDL hiện tại như là ngày hôm qua
        /// Còn CSDL ngày hôm nay chính là file gpsdata.sdf
        /// </summary>
        public static string ConnectDatabase(string dbName)
        {
            //string dbName = Path.GetDirectoryName(Application.ExecutablePath) + "\\gpsdata.sdf";
            try
            {
                //==========================================================
                //Kiểm tra file db có tồn tại không
                if (!File.Exists(dbName))
                    return string.Format("File {0} không tồn tại", dbName);

                //Kết nối đến CSDL mặc định
                GeneralClass.gpsDBFile = dbName;
                BaseDBCe.g_ConnectStr = string.Format("DataSource={0}; Password=''", GeneralClass.gpsDBFile); // Properties.Resources.ConnectString;

                //Thực hiện backup dữ liệu
                //BackupDB(dbName);
                //BaseDBCe.Upgrade();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "";
        }

        /// <summary>
        /// Kiểm tra tồn tại dữ liệu và backup
        /// </summary>
        /// <param name="dbName"></param>
        public static string BackupDB(string dbName)
        {
            string backupDBFile = "";
            try
            {
                //Kiểm tra xem file nếu có dữ liệu GPS thì tạo backup
                DataTable db = GPSDataRepository.LoadDatabase(0, 0);
                if (db.Rows.Count > 0)
                {
                    //Lấy ngày dữ liệu thêm mới gần nhất trong file data
                    DateTime recentDate = DateTime.Parse(db.Rows[db.Rows.Count - 1]["time"].ToString());
                    //Nếu ngày trong dữ liệu cuối khác với ngày hiện tại thì backup
                    if (recentDate != DateTime.Now)
                    {
                        //==========================================================
                        //Kiểm tra dữ liệu đã backup chưa. Nếu chưa thì backup
                        string backupFolder = string.Format("{0}\\BackupData",
                                                            Path.GetDirectoryName(Application.ExecutablePath));
                        if (!Directory.Exists(backupFolder))
                            Directory.CreateDirectory(backupFolder);

                        //Tạo file backup theo định dạng gpsdata_[year]-[month]-[day]-[hh]h[mm].sdf
                        backupDBFile = string.Format("{0}\\gpsdata_{1}-{2}-{3}-{4}h{5}.sdf", backupFolder,
                                                     recentDate.Year.ToString("####"),
                                                     recentDate.Month.ToString("0#"),
                                                     recentDate.Day.ToString("0#"), recentDate.Hour.ToString("0#"),
                                                     recentDate.Minute.ToString("0#"));
                        //Nếu tồn tại file backup thì delete trước rồi thực hiện backup
                        if (File.Exists(backupDBFile))
                        {
                            int index = 0;
                            //Tạo file backup theo định dạng gpsdata_[year]-[month]-[day]-[hh]h[mm].sdf
                            string fileName = string.Format("gpsdata_{0}-{1}-{2}-{3}h{4}",
                                                         recentDate.Year.ToString("####"),
                                                         recentDate.Month.ToString("0#"),
                                                         recentDate.Day.ToString("0#"), recentDate.Hour.ToString("0#"),
                                                         recentDate.Minute.ToString("0#"));
                            
                            do
                            {
                                index++;
                                backupDBFile = string.Format("{0}\\{1}-{2}.sdf", backupFolder, fileName, index);

                            } while (File.Exists(backupDBFile));
                        }
                            

                        //Backup file bằng cách copy
                        File.Copy(dbName, backupDBFile);

                    }
                }

                //Xóa hết dữ liệu plane data trong file gpsdata.sdf
                //PlaneRepository objPlaneRepository = new PlaneRepository(dbName);
                //objPlaneRepository.DeleteAll();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return backupDBFile;
            
        }

        /// <summary>
        /// Lấy tọa độ mới nhất của các đường bay
        /// </summary>
        public static void GetCurrGPSDataArr()
        {
            //Lấy tọa độ mới nhất của các đường bay
            if (GeneralClass.dbTestGPS.Rows.Count > 0)
            {
                //GeneralClass.currGPSData = new GPSCurrentPoint(GeneralClass.dbTestGPS.Rows[GeneralClass.dbTestGPS.Rows.Count - 1]);

                //Lấy danh sách các máy bay
                PlaneRepository objPlaneRepository = new PlaneRepository();
                DataTable dbPlane = objPlaneRepository.GetAll();
                GeneralClass.currGPSDataArr = new Dictionary<string, GPSCurrentPoint>();
                foreach (DataRow dr in GeneralClass.dbTestGPS.Rows)
                {
                    GPSCurrentPoint gpsPoint = new GPSCurrentPoint(dr);
                    //Nếu chưa có lưu đường bay mới nhất của máy bay đang chọn thì add vào
                    if (!GeneralClass.currGPSDataArr.ContainsKey(gpsPoint.objGPSData.Name))
                    {
                        GeneralClass.currGPSDataArr.Add(gpsPoint.objGPSData.Name, gpsPoint);
                        //Nếu đã đủ số lượng máy bay thì break
                        if (GeneralClass.currGPSDataArr.Count == dbPlane.Rows.Count)
                            break;
                    }
                }
            }
        }

        /// <summary>
        /// Hàm khởi tạo load database lần đầu
        /// </summary>
        public static void InitLoadDatabase(int min, int max)
        {
            if (GeneralClass.objCurrPlane != null)
                GeneralClass.dbTestGPS = GPSDataRepository.LoadDatabase(GeneralClass.objCurrPlane.Code, min, max);
            else
                GeneralClass.dbTestGPS = GPSDataRepository.LoadDatabase(min, max);
            //Lấy tọa độ mới nhất của các đường bay
            GeneralClass.GetCurrGPSDataArr();
        }

        /// <summary>
        /// Load danh sách tất cả các máy bay hiện có vào dictionary
        /// </summary>
        public static void LoadPlaneList()
        {
            GeneralClass.planeDict = new Dictionary<string, string>();
            PlaneRepository objPlaneRepository = new PlaneRepository();
            DataTable dbPlane = objPlaneRepository.GetAll();
            foreach (DataRow dr in dbPlane.Rows)
            {
                GeneralClass.planeDict.Add(dr["code"].ToString(), dr["name"].ToString());
            }
        }

        /// <summary>
        /// Nâng cấp CSDL
        /// </summary>
        public static void UpgradeGPSData()
        {
            //Kiểm tra xem column showname đã có chưa
            string sql = "select * from Information_SCHEMA.columns where Table_name='gpsdata' and column_name='showname'";
            DataSet ds = BaseDBCe.ExecSql_DataSet(sql);
            //Nếu chưa thì thêm column
            if (ds.Tables[0].Rows.Count == 0)
            {
                sql = "ALTER TABLE [gpsdata] ADD COLUMN [showname] nvarchar(10) NULL;";
                BaseDBCe.ExecSql_NoneQuery(sql);
            }

        }

    }
}
